<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>根对象 | Elasticsearch: 权威指南 | Elastic</title>
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
</head>
<body>
<div class="main-container">
    <section id="content">
        
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原文地址: <a href="https://www.elastic.co/guide/cn/elasticsearch/guide/current/root-object.html" rel="nofollow">https://www.elastic.co/guide/cn/elasticsearch/guide/current/root-object.html</a>, 版权归 www.elastic.co 所有<br/>
                            英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/guide/current/root-object.html" rel="nofollow">https://www.elastic.co/guide/en/elasticsearch/guide/current/root-object.html</a>
                            </div>
                        <!-- start body -->
                  <div class="page_header">
<b>请注意:</b><br>本书基于 Elasticsearch 2.x 版本，有些内容可能已经过时。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch: 权威指南</a></span>
»
<span class="breadcrumb-link"><a href="getting-started.html">基础入门</a></span>
»
<span class="breadcrumb-link"><a href="index-management.html">索引管理</a></span>
»
<span class="breadcrumb-node">根对象</span>
</div>
<div class="navheader">
<span class="prev">
<a href="mapping.html">« 类型和映射</a>
</span>
<span class="next">
<a href="dynamic-mapping.html">动态映射 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="root-object"></a>根对象<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/070_Index_Mgmt/30_Root_Object.asciidoc">edit</a>
</h2>
</div></div></div>
<p>映射的最高一层被称为 <em>根对象</em> ，它可能包含下面几项：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
一个 <em>properties</em> 节点，列出了文档中可能包含的每个字段的映射
</li>
<li class="listitem">
各种元数据字段，它们都以一个下划线开头，例如 <code class="literal">_type</code> 、 <code class="literal">_id</code> 和 <code class="literal">_source</code>
</li>
<li class="listitem">
设置项，控制如何动态处理新的字段，例如 <code class="literal">analyzer</code> 、 <code class="literal">dynamic_date_formats</code> 和
<code class="literal">dynamic_templates</code>
</li>
<li class="listitem">
其他设置，可以同时应用在根对象和其他 <code class="literal">object</code> 类型的字段上，例如 <code class="literal">enabled</code> 、 <code class="literal">dynamic</code> 和 <code class="literal">include_in_all</code>
</li>
</ul>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_属性"></a>属性<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/070_Index_Mgmt/30_Root_Object.asciidoc">edit</a>
</h3>
</div></div></div>
<p>我们已经在 <a class="xref" href="mapping-intro.html#core-fields" title="核心简单域类型">核心简单域类型</a> 和 <a class="xref" href="complex-core-fields.html" title="复杂核心域类型">复杂核心域类型</a> 章节中介绍过文档字段和属性的三个最重要的设置：</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">type</code>
</span>
</dt>
<dd>
字段的数据类型，例如 <code class="literal">string</code> 或 <code class="literal">date</code>
</dd>
<dt>
<span class="term">
<code class="literal">index</code>
</span>
</dt>
<dd>
字段是否应当被当成全文来搜索（ <code class="literal">analyzed</code> ），或被当成一个准确的值（ <code class="literal">not_analyzed</code> ），还是完全不可被搜索（ <code class="literal">no</code> ）
</dd>
<dt>
<span class="term">
<code class="literal">analyzer</code>
</span>
</dt>
<dd>
确定在索引和搜索时全文字段使用的 <code class="literal">analyzer</code>
</dd>
</dl>
</div>
<p>我们将在本书的后续部分讨论其他字段类型，例如 <code class="literal">ip</code> 、 <code class="literal">geo_point</code> 和 <code class="literal">geo_shape</code> 。</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="source-field"></a>元数据: _source 字段<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/070_Index_Mgmt/31_Metadata_source.asciidoc">edit</a>
</h3>
</div></div></div>
<p>默认地，Elasticsearch  在 <code class="literal">_source</code> 字段存储代表文档体的JSON字符串。和所有被存储的字段一样， <code class="literal">_source</code> 字段在被写入磁盘之前先会被压缩。</p>
<p>这个字段的存储几乎总是我们想要的，因为它意味着下面的这些：</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
搜索结果包括了整个可用的文档——不需要额外的从另一个的数据仓库来取文档。
</li>
<li class="listitem">
如果没有 <code class="literal">_source</code> 字段，部分 <code class="literal">update</code> 请求不会生效。
</li>
<li class="listitem">
当你的映射改变时，你需要重新索引你的数据，有了_source字段你可以直接从Elasticsearch这样做，而不必从另一个（通常是速度更慢的）数据仓库取回你的所有文档。
</li>
<li class="listitem">
当你不需要看到整个文档时，单个字段可以从 <code class="literal">_source</code> 字段提取和通过 <code class="literal">get</code> 或者 <code class="literal">search</code> 请求返回。
</li>
<li class="listitem">
调试查询语句更加简单，因为你可以直接看到每个文档包括什么，而不是从一列id猜测它们的内容。
</li>
</ul>
</div>
<p>然而，存储 <code class="literal">_source</code> 字段的确要使用磁盘空间。如果上面的原因对你来说没有一个是重要的，你可以用下面的映射禁用 <code class="literal">_source</code> 字段：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">PUT /my_index
{
    "mappings": {
        "my_type": {
            "_source": {
                "enabled":  false
            }
        }
    }
}</pre>
</div>
<p>在一个搜索请求里，你可以通过在请求体中指定 <code class="literal">_source</code> 参数，来达到只获取特定的字段的效果：</p>
<div class="pre_wrapper lang-sense">
<pre class="programlisting prettyprint lang-sense">GET /_search
{
    "query":   { "match_all": {}},
    "_source": [ "title", "created" ]
}</pre>
</div>
<div class="sense_widget" data-snippet="snippets/070_Index_Mgmt/31_Source_field.json"></div>
<p>这些字段的值会从 <code class="literal">_source</code> 字段被提取和返回，而不是返回整个 <code class="literal">_source</code> 。</p>
<div class="sidebar">
<div class="titlepage"><div><div>
<p class="title"><strong>Stored Fields 被存储字段</strong></p>
</div></div></div>
<p>为了之后的检索，除了索引一个字段的值，你  还可以选择 <code class="literal">存储</code> 原始字段值。有 Lucene 使用背景的用户使用被存储字段来选择他们想要在搜索结果里面返回的字段。事实上， <code class="literal">_source</code> 字段就是一个被存储的字段。</p>
<p>在Elasticsearch中，对文档的个别字段设置存储的做法通常不是最优的。整个文档已经被存储为 <code class="literal">_source</code> 字段。使用 <code class="literal">_source</code> 参数提取你需要的字段总是更好的。</p>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="all-field"></a>元数据: _all 字段<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/070_Index_Mgmt/32_Metadata_all.asciidoc">edit</a>
</h3>
</div></div></div>
<p>在 <a class="xref" href="search-lite.html" title="轻量 搜索"><em>轻量</em> 搜索</a> 中，我们介绍了 <code class="literal">_all</code> 字段：一个把其它字段值当作一个大字符串来索引的特殊字段。 <code class="literal">query_string</code> 查询子句(搜索 <code class="literal">?q=john</code> )在没有指定字段时默认使用 <code class="literal">_all</code> 字段。</p>
<p><code class="literal">_all</code> 字段在新应用的探索阶段，当你还不清楚文档的最终结构时是比较有用的。你可以使用这个字段来做任何查询，并且有很大可能找到需要的文档：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">GET /_search
{
    "match": {
        "_all": "john smith marketing"
    }
}</pre>
</div>
<p>随着应用的发展，搜索需求变得更加明确，你会发现自己越来越少使用 <code class="literal">_all</code> 字段。 <code class="literal">_all</code> 字段是搜索的应急之策。通过查询指定字段，你的查询更加灵活、强大，你也可以对相关性最高的搜索结果进行更细粒度的控制。</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p><a class="xref" href="relevance-intro.html" title="什么是相关性?">relevance algorithm</a> 考虑的一个最重要的原则是字段的长度：字段越短越重要。 在较短的 <code class="literal">title</code> 字段中出现的短语可能比在较长的 <code class="literal">content</code> 字段中出现的短语更加重要。字段长度的区别在 <code class="literal">_all</code> 字段中不会出现。</p>
</div>
</div>
<p>如果你不再需要 <code class="literal">_all</code> 字段，你可以通过下面的映射来禁用：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">PUT /my_index/_mapping/my_type
{
    "my_type": {
        "_all": { "enabled": false }
    }
}</pre>
</div>
<p>通过 <code class="literal">include_in_all</code> 设置来逐个控制字段是否要包含在 <code class="literal">_all</code> 字段中，默认值是 <code class="literal">true</code>。在一个对象(或根对象)上设置 <code class="literal">include_in_all</code> 可以修改这个对象中的所有字段的默认行为。</p>
<p>你可能想要保留 <code class="literal">_all</code> 字段作为一个只包含某些特定字段的全文字段，例如只包含 <code class="literal">title</code>，<code class="literal">overview</code>，<code class="literal">summary</code> 和 <code class="literal">tags</code>。 相对于完全禁用 <code class="literal">_all</code> 字段，你可以为所有字段默认禁用 <code class="literal">include_in_all</code> 选项，仅在你选择的字段上启用：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">PUT /my_index/my_type/_mapping
{
    "my_type": {
        "include_in_all": false,
        "properties": {
            "title": {
                "type":           "string",
                "include_in_all": true
            },
            ...
        }
    }
}</pre>
</div>
<p>记住，<code class="literal">_all</code> 字段仅仅是一个 经过分词的 <code class="literal">string</code> 字段。它使用默认分词器来分析它的值，不管这个值原本所在字段指定的分词器。就像所有 <code class="literal">string</code> 字段，你可以配置 <code class="literal">_all</code> 字段使用的分词器：</p>
<div class="pre_wrapper lang-js">
<pre class="programlisting prettyprint lang-js">PUT /my_index/my_type/_mapping
{
    "my_type": {
        "_all": { "analyzer": "whitespace" }
    }
}</pre>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_metadata_document_identity"></a>元数据：文档标识<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elasticsearch-cn/elasticsearch-definitive-guide/edit/cn/070_Index_Mgmt/33_Metadata_ID.asciidoc">edit</a>
</h3>
</div></div></div>
<p>文档标识与四个元数据字段相关：</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">_id</code>
</span>
</dt>
<dd>
文档的 ID 字符串
</dd>
<dt>
<span class="term">
<code class="literal">_type</code>
</span>
</dt>
<dd>
文档的类型名
</dd>
<dt>
<span class="term">
<code class="literal">_index</code>
</span>
</dt>
<dd>
文档所在的索引
</dd>
<dt>
<span class="term">
<code class="literal">_uid</code>
</span>
</dt>
<dd>
<code class="literal">_type</code> 和 <code class="literal">_id</code> 连接在一起构造成 <code class="literal">type#id</code>
</dd>
</dl>
</div>
<p>默认情况下， <code class="literal">_uid</code> 字段是被存储（可取回）和索引（可搜索）的。
<code class="literal">_type</code> 字段被索引但是没有存储，
<code class="literal">_id</code> 和 <code class="literal">_index</code> 字段则既没有被索引也没有被存储，这意味着它们并不是真实存在的。</p>
<p>尽管如此，你仍然可以像真实字段一样查询 <code class="literal">_id</code> 字段。Elasticsearch 使用 <code class="literal">_uid</code> 字段来派生出 <code class="literal">_id</code> 。
虽然你可以修改这些字段的 <code class="literal">index</code> 和 <code class="literal">store</code> 设置，但是基本上不需要这么做。</p>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="mapping.html">« 类型和映射</a>
</span>
<span class="next">
<a href="dynamic-mapping.html">动态映射 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>